001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Feb 9, 2003
005 * Time: 5:21:17 PM
006 */
007
008 package EVolve.visualization.XYViz.ValValViz;
009
010 import EVolve.data.*;
011 import EVolve.visualization.*;
012 import EVolve.visualization.Dimension;
013 import EVolve.visualization.VizFactory.VisualizationFactory;
014 import EVolve.util.painters.*;
015 import EVolve.util.predefinedutils.VizInfo;
016 import EVolve.Scene;
017 import EVolve.exceptions.VizInfoCreateException;
018 import EVolve.exceptions.NoDataPlotException;
019
020 import javax.swing.*;
021 import java.awt.*;
022 import java.awt.event.*;
023 import java.awt.image.BufferedImage;
024 import java.util.*;
025
026 public class EventViz extends ValueValueVisualization{
027 private JTextField textBegin,textEnd,textBoxSize;
028 private int boxSize = 10;
029 private ArrayList menuList;
030 private JMenuItem itemReArrange, itemSelectX, itemSelectTimeFrame, selectionMenu[] = null;
031 private static int SELECT_OPTION = 0x0011;
032 private JComboBox comboPainter,comboPredictor;
033 private Painter[] painters;
034 private int selectedPainter;
035 private PredictorFactory[] factory; // predictor factories
036 private Predictor[] predictor; // predictors
037 private AutoImage entityMapImage;
038 private final int PredictionPainter = 0, RandomColorPainter = 1, DefaultPainter = 2;
039 private JLabel toEventNo;
040
041
042 public EventViz(PredictorFactory[] factory) {
043 super();
044 menuList = new ArrayList();
045
046 beginCall = 0;
047 endCall = 300;
048 interval = 1;
049 selectedPainter = 0;
050 painters = createPainters();
051 this.factory = factory;
052 flipMagnifier = false;
053 }
054
055 private Painter[] createPainters() {
056 Painter[] painters = new Painter[3];
057 painters[0] = new EventPredictionPainter();
058 painters[1] = new RandomPainter();
059 painters[2] = new DefaultPainter();
060 return painters;
061 }
062
063 public void autoUpdateConfiguration(HashMap config) {
064 super.autoUpdateConfiguration(config);
065 if (config.get("Match")!=null) {
066 boxSize = (int)((Float)(config.get("Match"))).floatValue();
067 }
068 if (config.get("Options")!=null) {
069 String painterName = (String)config.get("Options");
070 for (int i=0; i<painters.length; i++)
071 if (painters[i].getName().equals(painterName)) {
072 selectedPainter = i;
073 break;
074 }
075 }
076 textBegin.setText(String.valueOf(beginCall));
077 textEnd.setText(String.valueOf(endCall));
078 textBoxSize = new JTextField(String.valueOf(boxSize));
079 }
080
081 protected void updateConfiguration() {
082
083 if (textBegin == null)
084 textBegin = new JTextField(String.valueOf(beginCall));
085 if (textEnd == null)
086 textEnd = new JTextField(String.valueOf(endCall));
087 if (textBoxSize == null)
088 textBoxSize = new JTextField(String.valueOf(boxSize));
089
090 try {
091 beginCall = Integer.parseInt(textBegin.getText());
092 endCall = Integer.parseInt(textEnd.getText());
093 boxSize = Integer.parseInt(textBoxSize.getText());
094
095 super.updateConfiguration();
096 } catch (NumberFormatException e) {
097 Scene.showErrorMessage("Begin call and end call must be an integer and smaller than "+Integer.MAX_VALUE+".");
098 configure();
099 };
100
101 }
102
103 public HashMap getCurrentConfigure() {
104 try {
105 HashMap configure = super.getCurrentConfigure();
106
107 VizInfo vizInfo = new VizInfo();
108 vizInfo.setFactory((VisualizationFactory)configure.get("Factory"));
109 vizInfo.setSubject((ElementDefinition)configure.get("Subject"));
110 String[] dimensionDefs = new String[3];
111 dimensionDefs[0] = xAxis.getName() ;
112 dimensionDefs[1] = entityIdFilter.getName() ;
113 dimensionDefs[2] = filter2.getName();
114 configure.put("Dimension",vizInfo.createDimension(dimensionDefs));
115 configure.put("Predictor",factory[comboPredictor.getSelectedIndex()]);
116
117 configure.put("Interval", new Integer(interval));
118 configure.put("BeginCall", new Long(beginCall));
119 configure.put("EndCall", new Long(endCall));
120 configure.put("Match", new Float(boxSize));
121 configure.put("Options",painters[selectedPainter].getName());
122
123 return configure;
124 }catch (VizInfoCreateException e) {
125 Scene.showErrorMessage(e.getMessage());
126 }
127 return null;
128 }
129
130 public Dimension[] createDimension() {
131 Dimension [] returnDimension = new Dimension[3];
132
133 xAxis = new ValueDimension();
134 entityIdFilter = new ReferenceDimension();
135 filter2 = new ReferenceDimension();
136
137 returnDimension[0] = xAxis;
138 returnDimension[1] = entityIdFilter;
139 returnDimension[2] = filter2;
140
141 return returnDimension;
142 }
143
144 protected Component createPanel() {
145 Component returnVal = super.createPanel();
146 canvas.setPanelFlag(AxesPanel.Null);
147 canvas.setZoomingSize(50,50);
148 flipMagnifier = false;
149 addMagnifier(canvas,flipMagnifier);
150
151 return returnVal;
152 }
153
154 public void preVisualize() {
155 super.preVisualize();
156 image = new AutoShapeImage(new EVolve.util.painters.shapes.Box(0,0,boxSize,boxSize));
157 entityMapImage = new AutoShapeImage(new EVolve.util.painters.shapes.Box(0,0,boxSize,boxSize));
158 canvas.setShapeSize(boxSize);
159 if (selectedPainter == 0) {
160 predictor = new Predictor[entityIdFilter.getMaxEntityNumber()];
161 for (int i = 0; i < predictor.length; i++) {
162 if (comboPredictor == null)
163 predictor[i] = factory[0].createPredictor();
164 else
165 predictor[i] = factory[comboPredictor.getSelectedIndex()].createPredictor();
166 }
167 }
168 getSelection();
169 installPainter();
170 }
171
172 protected void receiveElement(Element element) {
173 if (element.isOptional()) return;
174
175 long no = xAxis.getField(element) - 1;
176 long traceId = entityIdFilter.getField(element);
177 long z = filter2.getField(element);
178
179
180 countEvents(no);
181 if ((no < beginCall)||(no > endCall)) {
182 return;
183 }
184 if (selectedPainter != RandomColorPainter)
185 painters[1].paint(entityMapImage,(no-beginCall)%(panel.getWidth()/boxSize),
186 (no-beginCall)/(panel.getWidth()/boxSize),traceId);
187
188 if (selectedPainter == PredictionPainter) {// prediction color painter
189 painter.paint(image,no-beginCall,traceId,filter2.getEntityFromInt((int)z).getId());
190 } else {
191 painter.paint(image,(no-beginCall)%(panel.getWidth()/boxSize),
192 (no-beginCall)/(panel.getWidth()/boxSize),traceId);
193 }
194 }
195
196 public void visualize() {
197 sort();
198 }
199
200 public void sort() {
201 try {
202 int width = panel.getWidth() - ((JScrollPane)panel).getVerticalScrollBar().getWidth();
203 canvas.setShapeSize(boxSize);
204 ((AutoShapeImage)image).reArrange(width,boxSize);
205 if (selectedPainter != 1) ((AutoShapeImage)entityMapImage).reArrange(width,boxSize);
206 BufferedImage result = image.getImage();
207 canvas.setImage(result);
208 canvas.setPreferredSize(new java.awt.Dimension(result.getWidth(),result.getHeight()));
209 canvas.revalidate();
210 canvas.repaint();
211 } catch (NoDataPlotException e) {
212 Scene.showErrorMessage(e.getMessage());
213 }
214 }
215
216 protected void mouseMove(int x,int y) {
217 int X = canvas.getImageX(x);
218 int Y = canvas.getImageY(y);
219 AutoShapeImage aImage = (AutoShapeImage)image;
220 if (selectedPainter != 1)
221 aImage = (AutoShapeImage)entityMapImage;
222 Color color= (aImage == null) ? null : (Color)aImage.getColor(X/boxSize,Y/boxSize);
223 if (color != null) {
224 int mappedId = (int)((RandomPainter)painters[1]).getKeyFromColor(color);
225 Entity entity = entityIdFilter.getEntityFromInt(mappedId);
226 if (entity != null) {
227 Scene.setStatus(entity.getName()
228 + " " + xAxis.getDataFilter().getName()+":"+ (x/boxSize + aImage.getW() * (y/boxSize)));
229 }
230 } else {
231 Scene.setStatus(" ");
232 }
233 }
234
235 public void makeSelection() {
236 int w = image.getW();
237 int startX = canvas.getStartX()/boxSize;
238 int endX = canvas.getEndX()/boxSize;
239 int startY = canvas.getStartY()/boxSize;
240 int endY = canvas.getEndY()/boxSize;
241
242 if (dataSourceId != Scene.getDataSourceManager().getCurrentDataSourceId()) {
243 Scene.showErrorMessage("The active data source used currently is different from \n" +
244 "this visualization, please choose \"" +
245 Scene.getDataSourceManager().getUsedDataSourceName(dataSourceId)+"\".");
246 return;
247 }
248
249 long start = startX+startY*w;
250 long end = endX+endY*w;
251 long eventInterval[] = findEventInterval(start+beginCall, end+beginCall);
252 start = eventInterval[0];
253 end = eventInterval[1];
254
255 ArrayList idList = new ArrayList();
256
257 for (int i=startX; i<=endX; i++) {
258 for (int j=startY; j<=endY; j++) {
259 Long id = new Long(((RandomPainter)painter).getKeyFromColor((Color)image.getColor(i,j)));
260 if (!idList.contains(id))
261 idList.add(id);
262 }
263 }
264
265 int selection[] = null;
266 if ((SELECT_OPTION & 0x00f0) == SELECT_OCCURRED_ENTITIES) {
267 selection = new int[idList.size()];
268 for (int i=0; i<selection.length; i++)
269 selection[i] = ((Long)idList.get(i)).intValue();
270 } else {
271 selection = new int[entityIdFilter.getEntityNumber()];
272 for (int i=0; i<selection.length; i++)
273 selection[i] = i;
274 }
275 if ((SELECT_OPTION & 0x000f) == 0x0000) {
276 start = 0;
277 end = Long.MAX_VALUE;
278 }
279 entityIdFilter.makeSelection(subjectDefinition.getType(),selection,start,end,timeMap);
280 }
281
282 public JMenuItem[] createSelectionMenuItem() {
283 if (selectionMenu != null) return selectionMenu;
284
285 itemSelectTimeFrame = new JCheckBoxMenuItem("Time Frame");
286 itemSelectTimeFrame.setMnemonic(KeyEvent.VK_T);
287 itemSelectTimeFrame.addActionListener(new ActionListener() {
288 public void actionPerformed(ActionEvent e) {
289 boolean selected = itemSelectTimeFrame.isSelected();
290 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_TIME_FRAME);
291 }
292 });
293 itemSelectTimeFrame.setSelected(true);
294
295 itemSelectX = new JCheckBoxMenuItem("Occurred Entitiies");
296 itemSelectX.setMnemonic(KeyEvent.VK_O);
297 itemSelectX.addActionListener(new ActionListener() {
298 public void actionPerformed(ActionEvent e) {
299 boolean selected = itemSelectX.isSelected();
300 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_OCCURRED_ENTITIES);
301 }
302 });
303 itemSelectX.setSelected(true);
304
305 selectionMenu = new JMenuItem[2];
306 selectionMenu[0] = itemSelectTimeFrame;
307 selectionMenu[1] = itemSelectX;
308
309 return selectionMenu;
310 }
311
312 public int getBoxSize() {
313 return boxSize;
314 }
315
316 protected void installPainter() {
317 painters = createPainters();
318 painter = painters[selectedPainter];
319 if (selectedPainter == 0)
320 ((EventPredictionPainter)painter).setParameters(predictor,filter2.getDataFilter().getTargetType(),panel.getWidth()/boxSize);
321 }
322
323 protected ArrayList createOptionalMenu() {
324 if (menuList.size() > 0) return null;
325
326 menuList.clear();
327 itemReArrange = new JMenuItem("Rearrange");
328 itemReArrange.setMnemonic(KeyEvent.VK_R);
329 itemReArrange.addActionListener(new ActionListener() {
330 public void actionPerformed(ActionEvent e) {
331 String newSize = (String)JOptionPane.showInputDialog(Scene.getFrame(),
332 "Input new size for rectangles:",
333 "Rearrange",
334 JOptionPane.QUESTION_MESSAGE, null, null, String.valueOf(boxSize));
335 if (newSize!=null) {
336 boxSize = Integer.parseInt(newSize);
337 if (selectedPainter != 1)
338 ((AutoShapeImage)entityMapImage).reArrange(panel.getWidth(),boxSize);
339 sort();
340 }
341 }
342 });
343
344 menuList.add(itemReArrange);
345 return menuList;
346 }
347
348 public Object clone() {
349 EventViz o = (EventViz)super.clone();
350 o.dimension[0] = o.xAxis;
351 o.dimension[1] = o.entityIdFilter;
352 o.dimension[2] = o.filter2;
353 o.createDialog();
354 o.createMenu();
355 o.menuList = new ArrayList();
356 o.updateMenu();
357 o.painters = new Painter[3];
358 for (int i=0; i<o.painters.length; i++)
359 o.painters[i] = (Painter)painters[i].clone();
360 o.entityMapImage = (AutoShapeImage)entityMapImage.clone();
361
362 return o;
363 }
364
365 /**
366 * customize UI
367 */
368 protected void createDialog() {
369 dialog = new JDialog(Scene.getFrame(), "Configure", true);
370
371 JPanel panelTitle = new JPanel(new FlowLayout());
372 dialog.getContentPane().add(panelTitle, BorderLayout.NORTH);
373
374 panelTitle.add(new JLabel("Title: "));
375
376 textName = new JTextField(name, 12);
377 panelTitle.add(textName);
378
379 JPanel panelMain = new JPanel(new BorderLayout());
380 panelMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Choose subject & dimensions"));
381 dialog.getContentPane().add(panelMain, BorderLayout.CENTER);
382
383 JPanel panelName = new JPanel(new GridLayout(definition.getDimensionDefinition().length , 1, 5, 5));
384 panelMain.add(panelName, BorderLayout.WEST);
385
386 panelName.add(new JLabel(" Subject: "));
387 for (int i = 0; i < definition.getDimensionDefinition().length - 1; i++) {
388 panelName.add(new JLabel(" " + definition.getDimensionDefinition()[i].getName() + ": "));
389 }
390
391 JPanel panelCombo = new JPanel(new GridLayout(definition.getDimensionDefinition().length, 1, 5, 5));
392 panelMain.add(panelCombo, BorderLayout.CENTER);
393
394 comboSubject = new JComboBox();
395 for (int i = 0; i < elementDefinition.length; i++) {
396 comboSubject.addItem(elementDefinition[i].getName());
397 }
398 comboSubject.addActionListener(new ActionListener() {
399 public void actionPerformed(ActionEvent e) {
400 updateComboSubject();
401 }
402 });
403 panelCombo.add(comboSubject);
404
405 comboDimension = new JComboBox[definition.getDimensionDefinition().length];
406 for (int i = 0; i < comboDimension.length; i++) {
407 comboDimension[i] = new JComboBox();
408 comboDimension[i].addActionListener(new ActionListener() {
409 public void actionPerformed(ActionEvent e) {
410 updateComboDimension();
411 }
412 });
413 }
414 for (int i = 0; i < comboDimension.length - 1; i++)
415 panelCombo.add(comboDimension[i]);
416
417 JPanel returnVal = new JPanel(new GridLayout(1, 1, 5, 5));
418 JPanel panelEvent = new JPanel(new GridLayout(6,2));
419
420 Box panelBottom = new Box(BoxLayout.Y_AXIS);
421 returnVal.add(panelBottom);
422
423 comboPredictor = new JComboBox();
424 for (int i = 0; i < factory.length; i++) {
425 comboPredictor.addItem(factory[i].getName());
426 }
427
428 comboPainter = new JComboBox();
429 for (int i = 0; i < painters.length; i++) {
430 comboPainter.addItem(painters[i].getName());
431 }
432 comboPainter.addActionListener(new ActionListener() {
433 public void actionPerformed(ActionEvent e) {
434 selectedPainter = comboPainter.getSelectedIndex();
435 if (selectedPainter == 0) {
436 comboPredictor.setEnabled(true);
437 comboDimension[comboDimension.length-1].setEnabled(true);
438 } else {
439 comboPredictor.setEnabled(false);
440 comboDimension[comboDimension.length-1].setEnabled(false);
441 }
442 }
443 });
444 comboPainter.setSelectedIndex(selectedPainter);
445
446 panelEvent.add(new JLabel("Painter used: "));
447 panelEvent.add(comboPainter);
448 panelEvent.add(new JLabel(definition.getDimensionDefinition()[comboDimension.length -1].getName() + ": "));
449 panelEvent.add(comboDimension[comboDimension.length -1]);
450 panelEvent.add(new JLabel("Predictor: "));
451 panelEvent.add(comboPredictor);
452 panelEvent.add(new JLabel("From Event No:"));
453 panelEvent.add(textBegin);
454
455 String range = String.valueOf(Scene.getDataManager().getDataSource().getNumberOfEvents(elementDefinition[comboSubject.getSelectedIndex()].getName()));
456 toEventNo = new JLabel("To Event No:("+range+")");
457 panelEvent.add(toEventNo);
458 panelEvent.add(textEnd);
459 panelEvent.add(new JLabel("Box Size:"));
460 panelEvent.add(textBoxSize);
461
462 panelBottom.add(panelEvent);
463
464 updateComboSubject();
465
466 panelMain.add(returnVal, BorderLayout.SOUTH);
467
468 JPanel panelButton = new JPanel(new FlowLayout());
469 dialog.getContentPane().add(panelButton, BorderLayout.SOUTH);
470
471 JButton buttonApply = new JButton("Apply");
472 buttonApply.addActionListener(new ActionListener() {
473 public void actionPerformed(ActionEvent e) {
474 dialogApply();
475 }
476 });
477 panelButton.add(buttonApply);
478
479 JButton buttonCancel = new JButton("Cancel");
480 buttonCancel.addActionListener(new ActionListener() {
481 public void actionPerformed(ActionEvent e) {
482 dialogCancel();
483 }
484 });
485 panelButton.add(buttonCancel);
486
487 //*************
488 for (int i=0; i<comboSubject.getItemCount(); i++) {
489 if ((comboSubject.getItemAt(i)).equals(subjectDefinition.getName())) {
490 comboSubject.setSelectedIndex(i);
491 break;
492 }
493 }
494 for (int i=0;i<comboDimension.length;i++) {
495 for (int j =0 ; j<comboDimension[i].getItemCount();j++) {
496 if (comboDimension[i].getItemAt(j).equals(dimension[i].getDataFilter().getName())) {
497 comboDimension[i].setSelectedIndex(j);
498 break;
499 }
500 }
501 }
502 }
503
504 protected void updateComboSubject() {
505 super.updateComboSubject();
506 String range = String.valueOf(Scene.getDataManager().getDataSource().getNumberOfEvents(elementDefinition[comboSubject.getSelectedIndex()].getName()));
507 toEventNo.setText("To Event No:("+range+")");
508 }
509
510 }